package org.fastiot.protocol.group

import org.fastiot.protocol.codec.BitOutputStream
import org.fastiot.protocol.codec.BitSource

interface Groupable {
    static enum Type {
        Sequence(0), Calculation(1), Composite(2), KeyValue(3),
        CtrlAreaNet(11), SaeJ1939(12)
        final int value

        private Type(int value) { this.value = value }

        static Type byValue(int val) {
            values().find { it.value == val } ?:
                    { throw new IllegalArgumentException("Groupable\$Type ${val} not found") }()
        }
    }

    /**
     * 解码，根据规则从bitSource解析数据，结果存放到decodeContents中，过程中可能使用到decodeContents中其他的已解码内容
     * @param bitSource 比特（读取）源字，存放未解码的二进制数据包。
     * @param contents 解码内容映射。
     */
    void decode(final BitSource bitSource, final Map contents)

    /**
     * 编码，根据规则将数据编码成比特或字节后，存储在比特输出流对象。
     * @param bitOutput 比特输出流，存放编码后的二进制数据包。
     * @param contents 编码内容映射。
     */
    void encode(final BitOutputStream bitOutput, final Map contents)
}



